#!/usr/bin/env python3
# 使用 Python3 为默认打开方式
#########################################################################
# 作者：gfdgd xi
# 版本：1.0
# 感谢：感谢 E-speak 的制作者，提供了 E-speak 给大家使用，让我能做这个程序
# 基于 Python3 的 tkinter 构建
#########################################################################
#################
# 引入所需的库
#################
import tkinter as tk
import tkinter.messagebox
import tkinter.filedialog
import webbrowser
import threading
import os

# 程序窗口所需的事件
########################
# 显示“关于这个程序”窗口
########################
def about_this_program():
    tkinter.messagebox.showinfo(title="关于这个程序",message="一个基于 Python3 的 tkinter 制作的 espeak 朗读前端\n朗读文本\n版本：1.0\n适用平台：Linux\ntkinter 版本：" + str(tk.TkVersion))
##############
# 显示“提示”窗口
###############
def helps():
    tkinter.messagebox.showinfo(title="提示", message="提示：\n1、使用终端运行该程序，可以看到 espeak 以及程序本身的提示和报错")

# 显示朗读的进程
def speak_threading():
    things = e1_text.get()
    os.system('espeak -v ' + o1_text.get() + ' -s ' + e3_text.get() + ' "' + things + '"')
    o1.configure(state=tk.NORMAL)
    e1.configure(state=tk.NORMAL)
    e3.configure(state=tk.NORMAL)
    button1.configure(state=tk.NORMAL)

# 显示朗读事件
def speak():
    if e1_text.get() == "":
        tkinter.messagebox.showinfo(title="提示", message="请输入要朗读的内容")
    else:
        o1.configure(state=tk.DISABLED)
        e1.configure(state=tk.DISABLED) # 禁用控件
        e3.configure(state=tk.DISABLED)
        button1.configure(state=tk.DISABLED)
        a = threading.Thread(target=speak_threading)
        a.start()

# 显示浏览事件
def liulan():
    path = tkinter.filedialog.asksaveasfilename(filetypes=[("wav 音频文件", "*.wav"), ("所有文件", "*.*")], title="保存 wav 音频文件", initialdir="~")
    if path != "":
        e2_text.set(path)

# 保存 wav 的事件
def save():
    if e1_text.get() == "" or e2_text.get() == "":
        tkinter.messagebox.showinfo(title="提示", message="请输入朗读内容以及 wav 音频保存路径")
    else:
        o1.configure(state=tk.DISABLED)
        e1.configure(state=tk.DISABLED)  # 禁用控件
        e3.configure(state=tk.DISABLED)
        button1.configure(state=tk.DISABLED)
        e2.configure(state=tk.DISABLED)
        button2.configure(state=tk.DISABLED)
        button3.configure(state=tk.DISABLED)
        thread = threading.Thread(target=save_threading)
        thread.start()

# 保存 wav 的进程
def save_threading():
    os.system('espeak -v ' + o1_text.get() + ' -s ' + e3_text.get() + ' "' + e1_text.get() + '" -w "' + e2_text.get() + '"')
    o1.configure(state=tk.NORMAL)
    e1.configure(state=tk.NORMAL)  # 禁用控件
    e3.configure(state=tk.NORMAL)
    button1.configure(state=tk.NORMAL)
    e2.configure(state=tk.NORMAL)
    button2.configure(state=tk.NORMAL)
    button3.configure(state=tk.NORMAL)

# 显示 E-speak 的信息
def about_espeak():
    result = os.popen('espeak --version')
    res = result.read()
    things = ""
    for line in res.splitlines():
        things += line + "\n"
    tkinter.messagebox.showinfo(title="关于 espeak", message=things)

# 打开程序官网的事件
def start_program_URL():
    thread = threading.Thread(target=start_program_URL_threading)
    thread.start()

# 打开程序官网进程
def start_program_URL_threading():
    webbrowser.open("https://gitee.com/gfdgd-xi/espeak-reading-front-end")

###########################
# 窗口创建
###########################
print("程序报错信息：")
window = tk.Tk() # 创建窗口
window.title("espeak 朗读前端") # 设置标题
# 创建变量
o1_text = tk.StringVar()
e1_text = tk.StringVar()
e2_text = tk.StringVar()
e3_text = tk.StringVar()
# 设置变量
o1_text.set("zh")
e3_text.set("160")
# 创建控件
label0 = tk.Label(window, text="朗读语言")
o1 = tk.OptionMenu(window, o1_text, "en", "en-uk", "en-us", "zh")
label1 = tk.Label(window, text="输入需要朗读的文本")
e1 = tk.Entry(window, textvariable=e1_text, width=100)
label2 = tk.Label(window, text="朗读语速（默认 160 词每分钟）")
e3 = tk.Entry(window, textvariable=e3_text, width=5)
button1 = tk.Button(window, text="朗读", command=speak)
label3 = tk.Label(window, text="wav 保存路径")
e2 = tk.Entry(window, textvariable=e2_text, width=100)
button2 = tk.Button(window, text="浏览", command=liulan)
button3 = tk.Button(window, text="保存", command=save)
menu = tk.Menu(window) # 设置菜单栏
programmenu = tk.Menu(menu, tearoff=0) # 设置“程序”菜单栏
menu.add_cascade(label="程序", menu=programmenu)
programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项
help = tk.Menu(menu, tearoff=0) # 设置“帮助”菜单栏
menu.add_cascade(label="帮助", menu=help)
help.add_command(label="小提示", command=helps) # 设置“小提示”项
help.add_separator() # 设置分界线
help.add_command(label="关于 espeak", command=about_espeak)
help.add_command(label="关于这个程序", command=about_this_program) # 设置“关于这个程序”项
help.add_separator() # 设置分割线
help.add_command(label="打开软件源码", command=start_program_URL)
# 显示控件
window.config(menu=menu) # 显示菜单栏
# 添加变量
label0.pack()
o1.pack()
label1.pack()
e1.pack()
label2.pack()
e3.pack()
button1.pack()
label3.pack()
e2.pack()
button2.pack()
button3.pack()
window.mainloop() # 显示窗口
